package model

import "net/http"

// 权限 model, 所有租户通用，没有 tenantId
type Authority struct {
	ApiAuthority
	MenuAuthority
}

type Authorities struct {
	ApiAuths  []*ApiAuthority  `json:"apiAuths"`
	MenuAuths []*MenuAuthority `json:"menuAuths"`
}

func (a *Authorities) GenerateAuths() *Auths {
	auths := &Auths{}
	for _, ra := range a.ApiAuths {
		auths.ApiAuths = append(auths.ApiAuths, ra.ApiPath)
	}
	for _, ra := range a.MenuAuths {
		auths.ApiAuths = append(auths.ApiAuths, ra.Name)
	}
	return auths
}

func (auths *Authorities) GetCombinedAuth() []interface{} {
	var doc []interface{}
	if auths.ApiAuths != nil {
		for _, a := range auths.ApiAuths {
			doc = append(doc, a)
		}
	}
	if auths.MenuAuths != nil {
		for _, m := range auths.MenuAuths {
			doc = append(doc, m)
		}
	}

	return doc
}

type ApiAuthority struct {
	// api 类型的权限
	ApiPath       string `json:"path" bson:"path"`                   // 路径，比如 /api/user/add, (值唯一)
	Group         string `json:"group" bson:"group"`                 // 分组，比如 api组，user组，authority组
	Description   string `json:"description" bson:"description"`     // 简介，如 删除用户，添加用户
	RequestMethod string `json:"requestMethod" bson:"requestMethod"` // 请求方法，如，post,get

	IsRequiredAuthenticate bool   `json:"-" bson:"-"`       // 访问此路径是否需要认证
	Auth                   string `json:"auth" bson:"auth"` // 认证所需的权限

	Type    string           `json:"type" bson:"type"` // 类型：API, MENU
	Handler http.HandlerFunc `json:"-" bson:"-"`
}

type MenuAuthority struct {
	// menu 类型
	Name     string `json:"name" bson:"name"`         // 菜单名称，按钮名称，或权限名称 （值唯一）
	MenuPath string `json:"menuPath" bson:"menuPath"` // 路径
	Visible  bool   `json:"visible" bson:"visible"`   // 显隐

	Type string `json:"type" bson:"type"` // 类型：API, MENU

	BaseModel `json:",inline" bson:",inline"`
}

// 应用权限
type AppAuthority struct {
	// menu 类型
	Name  string `json:"name" bson:"name"`   // 权限名称
	Alia  string `json:"alia" bson:"alia"`   // 中文名称
	Group string `json:"group" bson:"group"` // 分组名称

	Type string `json:"type" bson:"type"` // 类型：FORM, PORTAL, EDITOR, STUDIO
}

func NewAppAuthority(name string, alia string, group string, authType string) *AppAuthority {
	return &AppAuthority{
		Name:  name,
		Alia:  alia,
		Group: group,
		Type:  authType,
	}
}

const (
	BackAuth = "BACK_AUTH" // 后台权限
	AppAuth  = "APP_AUTH"  // 应用权限
)
